package com.example.stujava.module.reflex;

/**
 * 反射机制、获取类的Class对象
 */
public class Unit1 {
    public static void main(String[] args) {
//-----------------------反射机制------------------------------------

//动态的获取一个类的所有属性和方法，动态的调用类的属性和方法

//反射功能：运行时判断一个对象所属的类，获取类的信息；运行时构造类的对象；运行时判断类的属性和方法；
//         运行时调用类的属性和方法；生成动态代理

//反射的组成：1.java.lang.Class.java：类对象；2.java.lang.reflect.Constructor.java：类的构造器对象；
//        3.java.lang.reflect.Method.java：类的方法对象；4.java.lang.reflect.Field.java：类的属性对象；

//反射中类的加载过程：一般情况下，类需要经过:加载->验证->准备->解析->初始化->使用->卸载这个过程

//反射的应用：逆向代码，如反编译；自定义注解；动态加载类；动态生成类；加载系统没有开放的接口；降低耦合


//-------------获取Class对象3种方式---------------------------
        Class cl = Student.class;

        try {
            //通过JVM查找并加载指定的类
            Class c2 = Class.forName("com.example.stujava.module.reflex.Student");
            //让加载的类在内存中创建对应的实例并赋值给stu
            Student stu = (Student) c2.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        Student student = new Student();
        Class c3 = student.getClass();

    }

}
